package main

import (
	"fmt"
	"net/http"
	"html/template"
	"strings"
//	"io"
	"log"
)

func sayHelloName(w http.ResponseWriter,r *http.Request){
	r.ParseForm()//parse parameters
	fmt.Println("--------------------------------------------")
	fmt.Println(r.Form)
	fmt.Println("path", r.URL.Path)
    fmt.Println("scheme", r.URL.Scheme)
    fmt.Println(r.Form["url_long"])
	for k,v:=range r.Form {
		fmt.Println("key: ",k)
		fmt.Println("val: ",strings.Join(v," "))
	}
	fmt.Fprintf(w, "Hello astaxie!")
}

func login(w http.ResponseWriter,r *http.Request){
	fmt.Println("--------------------------------------------")
	fmt.Println("Request Method: ",r.Method)
	fmt.Println("Form data: ",r.Form)
	if r.Method=="GET" {
		t,_:=template.ParseFiles("login.gtpl")
		t.Execute(w,nil)
	}else{
		r.ParseForm()
		fmt.Println("username: ",r.Form["username"])
		fmt.Println("password: ",r.Form["password"])
		fmt.Printf("username type %T\n",r.Form["username"])
		fmt.Fprintf(w,"username type %T\n",r.Form["username"])
		if len(r.Form["username"][0])==0 {
			//r.Form对不同类型的表单元素的留空有不同的处理， 
			//对于空文本框、空文本区域以及文件上传，元素的值为空值,
			//而如果是未选中的复选框和单选按钮，则根本不会在r.Form中产生相应条目，
			//如果我们用上面例子中的方式去获取数据时程序就会报错。
			//所以我们需要通过r.Form.Get()来获取值，因为如果字段不存在，通过该方式获取的是空值。
			//但是通过r.Form.Get()只能获取单个的值，如果是map的值，必须通过上面的方式来获取。
			fmt.Fprintf(w,"username len is 0\n")
		}
		fmt.Fprintf(w,"Form data: ",r.Form)
	}
}

func main(){
	http.HandleFunc("/",sayHelloName)
	http.HandleFunc("/login",login)
	er:=http.ListenAndServe(":9090",nil)
	if er!=nil{
		log.Fatal("ListenAndServe",er)
	}
}